#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/atomic.h>

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("简单的原子操作演示");

static atomic_t counter;

static int __init my_atomic_init(void)
{
    printk(KERN_INFO "原子模块加载\n");

    atomic_set(&counter, 0);  // 设置初始值为 0

    atomic_inc(&counter);     // +1
    atomic_add(3, &counter);  // +3（总共 4）

    int val = atomic_read(&counter);
    printk(KERN_INFO "当前 counter 值是：%d\n", val);

    if (atomic_dec_and_test(&counter)) {
        printk(KERN_INFO "减 1 后变成 0\n");
    } else {
        printk(KERN_INFO "减 1 后还不是 0，现在是：%d\n", atomic_read(&counter));
    }

    return 0;
}

static void __exit my_atomic_exit(void)
{
    printk(KERN_INFO "原子模块卸载\n");
}

module_init(my_atomic_init);
module_exit(my_atomic_exit);